/*
 * Copyright 2013 University of Padua, Italy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package it.unipd.dei.bd.icineasti.servlet;

import it.unipd.dei.bd.icineasti.database.CreateBigliettoDatabase;
import it.unipd.dei.bd.icineasti.database.CreateR_ConsumaDatabase;
import it.unipd.dei.bd.icineasti.database.GetIdPoltronaFromFilaNumeroIdSalaDatabase;
import it.unipd.dei.bd.icineasti.resource.Biglietto;
import it.unipd.dei.bd.icineasti.resource.R_Consuma;

import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.List;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.sql.DataSource;

/**
 * Completa una prenotazione o acquisto. In particolare:
 * - Se sono state effettuate delle PRENOTAZIONI crea le istanze di Biglietto.
 * - Se sono stati effettuati acquisti con CARTA DI CREDITO fa come nel caso precedente ma pone l'attributo Pagato dei Biglietti a
 * true invece che a false.
 * - Se sono stati effettuati acquisti con ABBONAMENTO fa come nel caso precedente e inoltre crea istanze di R_Consuma.
 * 
 * @author Visentin Lorenzo
 * @version 1.00
 */
public class ConfermaPrenotazioneOAcquistoServlet extends AbstractDatabaseServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {

		// imposta il tipo MIME della risposta
		res.setContentType("text/html");

		// ottiene un flusso di uscita per scrivere la risposta
		PrintWriter out = res.getWriter();
		HttpSession session = req.getSession(true);
		if (session.getValue("id_utente") == null) {
			return;
		}
		int codiceUtente = (Integer) session.getValue("id_utente");
		
		
		/* ----------------- PARAMETRI PASSATI ----------------- */
		
		/* "Prenotazione" se solo prenotazione, "CartaCredito" se acquisto con carta di credito, "Abbonamento" se acquisto con abbonamento */
		String tipoTransazione = req.getParameter("tipoTransazione");
		
		Timestamp dataOraEmissione = new Timestamp(System.currentTimeMillis());
		
		/* Contiene la lista ordinata dei prezzi */
		String prezzi = req.getParameter("prezzi");
		
		/* Contiene la lista ordinata di poltrone (identificate da fila e numero) */
		String poltrone = req.getParameter("poltrone");				// Da fila, numero e idSala ricavo idPoltrona
		
		int idSala = Integer.valueOf(req.getParameter("idSala"));
		
		int codiceSpettacolo = Integer.valueOf(req.getParameter("codiceSpettacolo"));
		
		/* Contiene la lista ordinata delle fasce relative ai biglietti */
		String fasce = req.getParameter("fasce");
		
		int numeroAbbonamento = Integer.valueOf(req.getParameter("numeroAbbonamento"));
		
		int codiceFilm = Integer.valueOf(req.getParameter("codiceFilm"));
		

		Connection con = null;
		
		/* ----------------------------------------------------- */

		try {
			con = DS.getConnection();
			con.setAutoCommit(false);
			
			String[] arrayPoltrone;		// Contiene la lista ordinata delle poltrone
			String[] file;				// Contiene la lista ordinata delle file delle poltrone
			int[] numeri;				// Contiene la lista ordinata dei numeri delle poltrone
			int[] idPoltrone;			// Contiene le chiavi primarie delle Poltrone
			int[] numBiglietti;			// Contiene le chiavi primarie dei Biglietti
			String[] arrayPrezzi;		// Contiene i prezzi delle singole prenotazioni
			String[] arrayFasce;		// Contiene le fasce delle singole prenotazioni
			
			/* Creo gli array delle file e dei numeri delle poltrone, ecc. */
			arrayPoltrone = poltrone.split(",");
			file = new String[arrayPoltrone.length];
			numeri = new int[arrayPoltrone.length];
			idPoltrone = new int[arrayPoltrone.length];
			numBiglietti = new int[arrayPoltrone.length];
			
			arrayPrezzi = prezzi.split(",");
			arrayFasce = fasce.split(",");
			
			/* 1 - PRENOTAZIONE */
			if (tipoTransazione.equals("Prenotazione")) {
				
				/* Per ogni singola prenotazione creo l'istanza di biglietto */ 
				for (int i = 0; i < arrayPoltrone.length; i++) {
					if (arrayPoltrone[i].length() != 0) {		// Se stringa non vuota
						file[i] = arrayPoltrone[i].substring(0, 1);
						numeri[i] = Integer.valueOf(arrayPoltrone[i].substring(1, arrayPoltrone[i].length())).intValue();
						
						/* Ottengo idPoltrona a partire da fila, numero e idSala */
						idPoltrone[i] = new GetIdPoltronaFromFilaNumeroIdSalaDatabase(con, file[i], numeri[i], idSala).getIdPoltrona();
						
						/* Creo l'istanza di Biglietto */
						Biglietto biglietto = new Biglietto(-1, new Timestamp(System.currentTimeMillis()), new BigDecimal(arrayPrezzi[i]), idPoltrone[i], codiceUtente, codiceSpettacolo, arrayFasce[i], false, true);
						numBiglietti[i] = new CreateBigliettoDatabase(con, biglietto).createBiglietto();
					}
				}	// Il commit lo faccio alla fine nel blocco finally
				
			/* 2 - ACQUISTO CON CARTA DI CREDITO */
			} else if (tipoTransazione.equals("CartaCredito")) {
				/* Per ogni singola prenotazione creo l'istanza di biglietto (con Pagato = true) */ 
				for (int i = 0; i < arrayPoltrone.length; i++) {
					if (arrayPoltrone[i].length() != 0) {		// Se stringa non vuota
						file[i] = arrayPoltrone[i].substring(0, 1);
						numeri[i] = Integer.valueOf(arrayPoltrone[i].substring(1, arrayPoltrone[i].length())).intValue();
						
						/* Ottengo idPoltrona a partire da fila, numero e idSala */
						idPoltrone[i] = new GetIdPoltronaFromFilaNumeroIdSalaDatabase(con, file[i], numeri[i], idSala).getIdPoltrona();
						
						/* Creo l'istanza di Biglietto */
						Biglietto biglietto = new Biglietto(-1, new Timestamp(System.currentTimeMillis()), new BigDecimal("0"), idPoltrone[i], codiceUtente, codiceSpettacolo, arrayFasce[i], true, true);
						numBiglietti[i] = new CreateBigliettoDatabase(con, biglietto).createBiglietto();
					}
				}	// Il commit lo faccio alla fine nel blocco finally
				
			/* 3 - ACQUISTO CON ABBONAMENTO */
			} else if (tipoTransazione.equals("Abbonamento")) {
				for (int i = 0; i < arrayPoltrone.length; i++) {
					if (arrayPoltrone[i].length() != 0) {		// Se stringa non vuota (per sicurezza)
						file[i] = arrayPoltrone[i].substring(0, 1);
						numeri[i] = Integer.valueOf(arrayPoltrone[i].substring(1, arrayPoltrone[i].length())).intValue();
						
						/* Ottengo idPoltrona a partire da fila, numero e idSala */
						idPoltrone[i] = new GetIdPoltronaFromFilaNumeroIdSalaDatabase(con, file[i], numeri[i], idSala).getIdPoltrona();
						
						/* Creo l'istanza di Biglietto */
						Biglietto biglietto = new Biglietto(-1, new Timestamp(System.currentTimeMillis()), new BigDecimal("0"), idPoltrone[i], codiceUtente, codiceSpettacolo, arrayFasce[i], true, true);
						numBiglietti[i] = new CreateBigliettoDatabase(con, biglietto).createBiglietto();
						
						/* Crea l'istanza di R_Consuma */
						R_Consuma r_Consuma = new R_Consuma(numBiglietti[i], numeroAbbonamento, codiceFilm);
						new CreateR_ConsumaDatabase(con, r_Consuma).createR_Consuma();
					}
				}
			}
			
			out.print("Success");

		} catch (NullPointerException e) {
			out.printf("<p><font color=\"red\">Impossibile creare la connessione al database.</font></p>");
		} catch (SQLException e) {
			out.printf(
					"<p><font color=\"red\">Errore durante l'accesso al database: %s</font></p>",
					e.getMessage());
			
		} finally {
			
			try {
				con.commit();	// Faccio il commit della transazione
				con.setAutoCommit(true);
				con.close();	// Chiudo la connessione
			} catch (SQLException e) {}
		}

		// assicura che tutto il contenuto sia inviato
		out.flush();

		// chiude il flusso di uscita
	//	out.close();

	}

}
